package mybox.engine;

public class RandLinieOO implements Figur {
	
	public static final boolean UNTEN=true;
	public static final boolean RECHTS=true;
	public static final boolean OBEN=true;
	public static final boolean LINKS=true;
	public static final boolean NOLINE=false;
	
	public QVector anfangPos;
	public QVector endPos;
	public QVector endPosInnen;
	public QVector anfang2end;
	public double angle;
	
	public int    anzahlZinken;
	public double randLaenge;
	public double reducedRandLaenge;
	public double zinkenHoehe;
	public double zinkenABreite;
	public double zinkenIBreite;
	
	public boolean isGlatt;
	public boolean isFemale;
	public boolean hasRandVerkuerzt;
	public boolean isRand;
	
	
	/*
	public double mZinkenIBreite;
	public double mZinkenABreite; 
	public double mrandLaenge; 
	*/
	
	Rectangle randBeginn, randEnde;
	Rectangle reducedRandBeginn, reducedRandEnde;
	Rectangle[] zinken,negZinken;
	
	public File4Qcad file4qcad=null;
	
	RlScriptOO rlScript;
	
	public RandLinieOO(
			File4Qcad file4qcad,
			QVector refPos,
			double phi,
			double linienLaenge,			
			double materialDicke,
			double zinkungsFaktor,
			double laserBreite,
			boolean isGlatt,
			boolean isRand,
			boolean isFemale,
			boolean hasRandVerkuerzt) {		
		
		this.file4qcad=file4qcad;
		rlScript = new RlScriptOO(file4qcad);
		
		this.anfangPos = new QVector(refPos);
		
		angle=phi;
		this.isGlatt=isGlatt;
		this.isFemale=isFemale;
		this.hasRandVerkuerzt=hasRandVerkuerzt;
		this.isRand=isRand;
		
		double modLinienLaenge=linienLaenge;
		if (hasRandVerkuerzt) modLinienLaenge=modLinienLaenge+2*materialDicke;
		
		 anzahlZinken	=	RandLinie.anzahlZinken(modLinienLaenge,materialDicke,zinkungsFaktor, laserBreite)-2;
		 zinken = new Rectangle[anzahlZinken];
		 
		 negZinken = new Rectangle[anzahlZinken+1];		 
		 
		 zinkenHoehe	=	RandLinie.calcZinkenHoehe(materialDicke);
		 
		 //if (isFemale)      ;//zinkenHoehe-=laserBreite;
		 //else if (!isRand)  zinkenHoehe-=laserBreite;
		 
		 if (!isRand)  zinkenHoehe-=laserBreite;;
		 
		 zinkenABreite	=	RandLinie.aBreite(materialDicke,zinkungsFaktor);
		 zinkenIBreite	=	RandLinie.iBreite(zinkenABreite,laserBreite);
		 randLaenge		=	RandLinie.randBreite(hasRandVerkuerzt, modLinienLaenge, materialDicke, zinkungsFaktor, laserBreite);
		 
		 if (!isFemale) {
			 
			 double mZinkenIBreite	=	zinkenABreite+laserBreite;
			 double mZinkenABreite	=	zinkenIBreite-laserBreite;
			 double mrandLaenge	=	randLaenge-laserBreite;
			 
			 zinkenABreite=mZinkenABreite;
			 zinkenIBreite=mZinkenIBreite;
			 randLaenge=mrandLaenge;
			 
		 }
		 reducedRandLaenge=randLaenge-zinkenHoehe;
		 		 		 
		 randBeginn = new Rectangle(file4qcad,refPos,randLaenge,zinkenHoehe,phi);
		 reducedRandBeginn = new Rectangle(file4qcad,refPos,reducedRandLaenge,zinkenHoehe,phi);
		 
		 negZinken[0] = new Rectangle(file4qcad,randBeginn.lowerRight,zinkenIBreite,zinkenHoehe,phi);
		 for (int zix=0;zix<anzahlZinken;zix++) {
			     zinken[zix] = new Rectangle(file4qcad,negZinken[zix].lowerRight,zinkenABreite,zinkenHoehe,phi);
				 negZinken[zix+1] = new Rectangle(file4qcad, zinken[zix].lowerRight, zinkenIBreite, zinkenHoehe, phi);
		 }
		 randEnde = new Rectangle(file4qcad, negZinken[anzahlZinken].lowerRight, randLaenge, zinkenHoehe, phi);
		 reducedRandEnde = new Rectangle(file4qcad,negZinken[anzahlZinken].lowerRight,reducedRandLaenge,zinkenHoehe,phi);
			
		 
		 endPos = new QVector(randEnde.lowerRight);
		 this.endPosInnen = new QVector(randEnde.upperRight);
		 anfang2end=new QVector(endPos.x-anfangPos.x,endPos.y-anfangPos.y);
		
		 
		 
	}

	public void drawDebug() {
		// TODO Auto-generated method stub
		randBeginn.draw();
		
		//negZinken[0].draw();		
		 for (int zix=0;zix<anzahlZinken;zix++) {
			     zinken[zix].draw();			     
				 //negZinken[zix+1].draw();
		 }		
		randEnde.draw();
	}
	
	public void draw() {

		Rectangle drawRandBeginn,drawRandEnde;
		/*if (hasRandVerkuerzt) {
			drawRandBeginn=reducedRandBeginn;
			drawRandEnde=reducedRandEnde;
		} else {*/
			drawRandBeginn=randBeginn;
			drawRandEnde=randEnde;
		//}
			
			rlScript.randBeginn_x=anfangPos.x;
			rlScript.randBeginn_y=anfangPos.y;			
			rlScript.randLaenge=randLaenge;
			rlScript.isGlatt=true;
			rlScript.gesamtLaenge=anfang2end.length();
			rlScript.richtung_x=anfang2end.x;
			rlScript.richtung_y=anfang2end.y;
			rlScript.isNachInnen=false;
			rlScript.zinkenLaenge=zinkenHoehe;
			rlScript.innenLaenge=zinkenABreite;
			rlScript.aussenLaenge=zinkenIBreite;			
			rlScript.anzahlZinken=0;
		
		if (isGlatt) {			
			rlScript.isGlatt=true;
			file4qcad.println(anfang2end.printLineAktPosNeutral(anfangPos));
			//rlScript.draw();
		} else {
			if (isFemale) {
				if (isRand) {
					
					/*rlScript.isGlatt=false;	
					rlScript.isNachInnen=true;
					rlScript.anzahlZinken=anzahlZinken;
					*/
					
					drawRandBeginn.draw(UNTEN, NOLINE, NOLINE, NOLINE);					
					drawRandEnde.draw(UNTEN, NOLINE, NOLINE, NOLINE);
					
					
					negZinken[0].draw(NOLINE,RECHTS,OBEN,LINKS);
					for (int zix=0;zix<anzahlZinken;zix++) {
						negZinken[zix+1].draw(NOLINE,RECHTS,OBEN,LINKS);
						zinken[zix].draw(UNTEN,NOLINE,NOLINE,NOLINE);	
					} 
				    //rlScript.draw();
				}
				else { 				
					for (int zix=0;zix<anzahlZinken+1;zix++) 
						negZinken[zix].draw(UNTEN,RECHTS,OBEN,LINKS);
				}
			} else { //not is Female			
				if (isRand) {	
					rlScript.isGlatt=false;
					rlScript.isNachInnen=false;
					rlScript.anzahlZinken=anzahlZinken;
					
					drawRandBeginn.draw(NOLINE, NOLINE, OBEN, NOLINE);
					drawRandEnde.draw(NOLINE, NOLINE, OBEN, NOLINE);
					negZinken[0].draw(UNTEN,RECHTS,NOLINE,LINKS);
					for (int zix=0;zix<anzahlZinken;zix++) {
						negZinken[zix+1].draw(UNTEN,RECHTS,NOLINE,LINKS);
						zinken[zix].draw(NOLINE,NOLINE,OBEN,NOLINE);	
					}
					//rlScript.draw();
				}  //not Rand
				else { 
					drawRandBeginn.draw(UNTEN, RECHTS, OBEN, NOLINE);
					drawRandEnde.draw(UNTEN, NOLINE, OBEN, LINKS);
					for (int zix=0;zix<anzahlZinken;zix++) 
						zinken[zix].draw(UNTEN,RECHTS,OBEN,LINKS);							
				}			
			
			} 
		}
		
		
	}
	
	public void drawFull() {
		
	}

}
